React์ ์คํ์ ์ธ experimental_useOptimistic ํ ์ฌ์ธต ๋ถ์: ๋ ๋ถ๋๋ฝ๊ณ ๋ฐ์์ฑ์ด ๋ฐ์ด๋ ์ฌ์ฉ์ ์ธํฐํ์ด์ค์ ํฅ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ์ ์ํ ๋๊ด์ ์ ๋ฐ์ดํธ ๊ตฌํ ๋ฐฉ๋ฒ์ ๋ฐฐ์๋ณด์ธ์.
React experimental_useOptimistic: ๋๊ด์ ์ ๋ฐ์ดํธ ๋ง์คํฐํ๊ธฐ
ํ๋ ์น ๊ฐ๋ฐ ๋ถ์ผ์์ ๋๊น ์๊ณ ๋ฐ์์ฑ์ด ๋ฐ์ด๋ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋ ๊ฒ์ ๊ฐ์ฅ ์ค์ํฉ๋๋ค. ์ฌ์ฉ์๋ค์ ํผ์ ์ ์ถํ๊ฑฐ๋ ์๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ์
๋ฐ์ดํธํ๋ ๊ฒ๊ณผ ๊ฐ์ ๋น๋๊ธฐ ์์
์ ์ฒ๋ฆฌํ ๋์๋ ์ฆ๊ฐ์ ์ธ ํผ๋๋ฐฑ๊ณผ ์ต์ํ์ ์ฒด๊ฐ ์ง์ฐ ์๊ฐ์ ๊ธฐ๋ํฉ๋๋ค. React์ experimental_useOptimistic ํ
์ ์ด๋ฅผ ๋ฌ์ฑํ๊ธฐ ์ํ ๊ฐ๋ ฅํ ๋ฉ์ปค๋์ฆ์ธ ๋๊ด์ ์
๋ฐ์ดํธ(optimistic updates)๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด ๊ธ์์๋ experimental_useOptimistic์ ์ดํดํ๊ณ ๊ตฌํํ๊ธฐ ์ํ ํฌ๊ด์ ์ธ ๊ฐ์ด๋๋ฅผ ์ ๊ณตํ์ฌ, ์ฌ๋ฌ๋ถ์ด ๋ ๋งค๋ ฅ์ ์ด๊ณ ์ฑ๋ฅ์ด ๋ฐ์ด๋ React ์ ํ๋ฆฌ์ผ์ด์
์ ๋ง๋ค ์ ์๋๋ก ์ง์ํฉ๋๋ค.
๋๊ด์ ์ ๋ฐ์ดํธ(Optimistic Updates)๋ ๋ฌด์์ธ๊ฐ์?
๋๊ด์ ์ ๋ฐ์ดํธ๋ ๋น๋๊ธฐ ์์ ์ ๊ฒฐ๊ณผ์ ๋ํ ์๋ฒ์ ํ์ธ์ ๋ฐ๊ธฐ ์ ์, ์์๋๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์ํ์ฌ ์ฆ์ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ์ ๋ฐ์ดํธํ๋ UI ๊ธฐ์ ์ ๋๋ค. ์ด ๊ธฐ์ ์ ํด๋น ์์ ์ด ์ฑ๊ณตํ ๊ฒ์ด๋ผ๋ ๊ฐ์ ์ ๊ธฐ๋ฐํฉ๋๋ค. ๋ง์ฝ ์์ ์ด ๊ฒฐ๊ตญ ์คํจํ๋ฉด, UI๋ ์ด์ ์ํ๋ก ๋๋์๊ฐ๋๋ค. ์ด๋ ์ฆ๊ฐ์ ์ธ ํผ๋๋ฐฑ์ ํ์์ ๋ง๋ค์ด๋ด๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒด๊ฐ ๋ฐ์์ฑ์ ๊ทน์ ์ผ๋ก ํฅ์์ํต๋๋ค.
์ฌ์ฉ์๊ฐ ์์ ๋ฏธ๋์ด ๊ฒ์๋ฌผ์ "์ข์์" ๋ฒํผ์ ํด๋ฆญํ๋ ์๋๋ฆฌ์ค๋ฅผ ์๊ฐํด ๋ณด์ธ์. ๋๊ด์ ์ ๋ฐ์ดํธ๊ฐ ์๋ค๋ฉด, UI๋ ์ผ๋ฐ์ ์ผ๋ก ์๋ฒ๊ฐ '์ข์์'๋ฅผ ํ์ธํ ํ์์ผ '์ข์์' ์๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค. ์ด๋ ํนํ ๋คํธ์ํฌ ์ฐ๊ฒฐ์ด ๋๋ฆด ๋ ๋์ ๋๋ ์ง์ฐ์ ์ ๋ฐํ ์ ์์ต๋๋ค. ๋๊ด์ ์ ๋ฐ์ดํธ๋ฅผ ์ฌ์ฉํ๋ฉด, ๋ฒํผ์ ํด๋ฆญํ๋ ์ฆ์ '์ข์์' ์๊ฐ ์ฆ๊ฐํฉ๋๋ค. ์๋ฒ๊ฐ '์ข์์'๋ฅผ ํ์ธํ๋ฉด ๋ชจ๋ ๊ฒ์ด ์ ์์ ์ผ๋ก ์ฒ๋ฆฌ๋ฉ๋๋ค. ๋ง์ฝ ์๋ฒ๊ฐ '์ข์์'๋ฅผ ๊ฑฐ๋ถํ๋ฉด(์ค๋ฅ๋ ๊ถํ ๋ฌธ์ ๋ฑ์ผ๋ก), '์ข์์' ์๋ ๋ค์ ๊ฐ์ํ๊ณ ์ฌ์ฉ์์๊ฒ ์คํจ ์ฌ์ค์ ์๋ฆฝ๋๋ค.
experimental_useOptimistic ์๊ฐ
React์ experimental_useOptimistic ํ
์ ๋๊ด์ ์
๋ฐ์ดํธ์ ๊ตฌํ์ ๋จ์ํํฉ๋๋ค. ์ด ํ
์ ๋๊ด์ ์ํ๋ฅผ ๊ด๋ฆฌํ๊ณ ํ์ํ ๊ฒฝ์ฐ ์๋ ์ํ๋ก ๋๋๋ฆด ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ํ์ฌ ์ด ํ
์ ์คํ์ ๊ธฐ๋ฅ์ด๋ผ๋ ์ ์ ์ ์ํด์ผ ํฉ๋๋ค. ์ฆ, ํฅํ React ๋ฒ์ ์์ API๊ฐ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. ํ์ง๋ง ์ด๋ React ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๋ฏธ๋๋ฅผ ์ฟ๋ณผ ์ ์๋ ๊ท์คํ ๊ธฐํ๋ฅผ ์ ๊ณตํฉ๋๋ค.
๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ
experimental_useOptimistic ํ
์ ๋ ๊ฐ์ ์ธ์๋ฅผ ๋ฐ์ต๋๋ค:
- ์๋ณธ ์ํ: ๋๊ด์ ์ผ๋ก ์ ๋ฐ์ดํธํ๋ ค๋ ๋ฐ์ดํฐ์ ์ด๊ธฐ ๊ฐ์ ๋๋ค.
- ์ ๋ฐ์ดํธ ํจ์: ๋๊ด์ ์ ๋ฐ์ดํธ๋ฅผ ์ ์ฉํ๊ณ ์ถ์ ๋ ํธ์ถ๋๋ ํจ์์ ๋๋ค. ์ด ํจ์๋ ํ์ฌ ๋๊ด์ ์ํ์ ์ ํ์ ์ธ์(์ผ๋ฐ์ ์ผ๋ก ์ ๋ฐ์ดํธ ๊ด๋ จ ๋ฐ์ดํฐ)๋ฅผ ๋ฐ์ ์๋ก์ด ๋๊ด์ ์ํ๋ฅผ ๋ฐํํฉ๋๋ค.
์ด ํ ์ ๋ค์์ ํฌํจํ๋ ๋ฐฐ์ด์ ๋ฐํํฉ๋๋ค:
- ํ์ฌ ๋๊ด์ ์ํ: ์๋ณธ ์ํ์ ์ ์ฉ๋ ๋ชจ๋ ๋๊ด์ ์ ๋ฐ์ดํธ๋ฅผ ๋ชจ๋ ๋ฐ์ํ๋ ์ํ์ ๋๋ค.
addOptimisticํจ์: ๋๊ด์ ์ ๋ฐ์ดํธ๋ฅผ ์ ์ฉํ ์ ์๊ฒ ํด์ฃผ๋ ํจ์์ ๋๋ค. ์ด ํจ์๋ ์ ๋ฐ์ดํธ ํจ์์ ์ ๋ฌ๋ ์ ํ์ ์ธ์๋ฅผ ๋ฐ์ต๋๋ค.
์์ : ๋๊ด์ ์ข์์ ์นด์ดํฐ
๊ฐ๋จํ ์ข์์ ์นด์ดํฐ ์์ ๋ก ์ค๋ช ํด ๋ณด๊ฒ ์ต๋๋ค:
import React, { useState } from 'react';
import { experimental_useOptimistic as useOptimistic } from 'react';
function LikeButton({ postId }) {
const [likes, setLikes] = useState(50); // ์ด๊ธฐ ์ข์์ ์
const [optimisticLikes, addOptimistic] = useOptimistic(
likes,
(state, newLike) => state + newLike // ์
๋ฐ์ดํธ ํจ์
);
const handleLike = async () => {
addOptimistic(1); // ๋๊ด์ ์ผ๋ก ์ข์์ ์ฆ๊ฐ
try {
// ๊ฒ์๋ฌผ์ ์ข์์๋ฅผ ๋๋ฅด๋ API ํธ์ถ ์๋ฎฌ๋ ์ด์
await new Promise(resolve => setTimeout(resolve, 500)); // ๋คํธ์ํฌ ์ง์ฐ ์๊ฐ ์๋ฎฌ๋ ์ด์
// ์ค์ ์ ํ๋ฆฌ์ผ์ด์
์์๋ ์ฌ๊ธฐ์ API๋ฅผ ํธ์ถํฉ๋๋ค
// await api.likePost(postId);
setLikes(optimisticLikes); // API ํธ์ถ ์ฑ๊ณต ํ ์ค์ ์ข์์ ์๋ฅผ ๋๊ด์ ๊ฐ์ผ๋ก ์
๋ฐ์ดํธ
} catch (error) {
console.error("Failed to like post:", error);
addOptimistic(-1); // API ํธ์ถ ์คํจ ์ ๋๊ด์ ์
๋ฐ์ดํธ ๋๋๋ฆฌ๊ธฐ
setLikes(likes);
}
};
return (
);
}
export default LikeButton;
์ค๋ช :
likes์ํ๋ฅผ ์ด๊ธฐ๊ฐ(์: 50)์ผ๋ก ์ด๊ธฐํํฉ๋๋ค.experimental_useOptimistic๋ฅผ ์ฌ์ฉํ์ฌoptimisticLikes์ํ์addOptimisticํจ์๋ฅผ ์์ฑํฉ๋๋ค.- ์
๋ฐ์ดํธ ํจ์๋
state๋ฅผnewLike๊ฐ(์ด ๊ฒฝ์ฐ 1)๋งํผ ๋จ์ํ ์ฆ๊ฐ์ํต๋๋ค. - ๋ฒํผ์ ํด๋ฆญํ๋ฉด
addOptimistic(1)์ ํธ์ถํ์ฌ ํ์๋๋ ์ข์์ ์๋ฅผ ์ฆ์ ์ฆ๊ฐ์ํต๋๋ค. - ๊ทธ๋ฐ ๋ค์
setTimeout์ ์ฌ์ฉํ์ฌ API ํธ์ถ์ ์๋ฎฌ๋ ์ด์ ํฉ๋๋ค. ์ค์ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ์ฌ๊ธฐ์ ์ค์ API๋ฅผ ํธ์ถํฉ๋๋ค. - API ํธ์ถ์ด ์ฑ๊ณตํ๋ฉด ์ค์
likes์ํ๋ฅผoptimisticLikes๊ฐ์ผ๋ก ์ ๋ฐ์ดํธํฉ๋๋ค. - API ํธ์ถ์ด ์คํจํ๋ฉด
addOptimistic(-1)์ ํธ์ถํ์ฌ ๋๊ด์ ์ ๋ฐ์ดํธ๋ฅผ ๋๋๋ฆฌ๊ณ ์ข์์๋ฅผ ์๋ ์ํ๋ก ์ค์ ํฉ๋๋ค.
๊ณ ๊ธ ์ฌ์ฉ๋ฒ: ๋ณต์กํ ๋ฐ์ดํฐ ๊ตฌ์กฐ ์ฒ๋ฆฌํ๊ธฐ
experimental_useOptimistic๋ ๋ ๋ณต์กํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ๋๊ธ ๋ชฉ๋ก์ ๋๊ธ์ ์ถ๊ฐํ๋ ์์ ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค:
import React, { useState } from 'react';
import { experimental_useOptimistic as useOptimistic } from 'react';
function CommentList({ postId }) {
const [comments, setComments] = useState([
{ id: 1, text: 'This is a great post!' },
{ id: 2, text: 'I learned a lot from this.' },
]);
const [optimisticComments, addOptimistic] = useOptimistic(
comments,
(state, newComment) => [...state, newComment] // ์
๋ฐ์ดํธ ํจ์
);
const handleAddComment = async (text) => {
const newComment = { id: Date.now(), text }; // ์์ ID ์์ฑ
addOptimistic(newComment); // ๋๊ด์ ์ผ๋ก ๋๊ธ ์ถ๊ฐ
try {
// ๋๊ธ์ ์ถ๊ฐํ๋ API ํธ์ถ ์๋ฎฌ๋ ์ด์
await new Promise(resolve => setTimeout(resolve, 500)); // ๋คํธ์ํฌ ์ง์ฐ ์๊ฐ ์๋ฎฌ๋ ์ด์
// ์ค์ ์ ํ๋ฆฌ์ผ์ด์
์์๋ ์ฌ๊ธฐ์ API๋ฅผ ํธ์ถํฉ๋๋ค
// await api.addComment(postId, text);
setComments(optimisticComments);
} catch (error) {
console.error("Failed to add comment:", error);
// ์์ ๋๊ธ์ ํํฐ๋งํ์ฌ ๋๊ด์ ์
๋ฐ์ดํธ ๋๋๋ฆฌ๊ธฐ
setComments(comments);
}
};
return (
{optimisticComments.map(comment => (
- {comment.text}
))}
);
}
function CommentForm({ onAddComment }) {
const [text, setText] = useState('');
const handleSubmit = (e) => {
e.preventDefault();
onAddComment(text);
setText('');
};
return (
);
}
export default CommentList;
์ค๋ช :
comments์ํ๋ฅผ ๋๊ธ ๊ฐ์ฒด ๋ฐฐ์ด๋ก ์ด๊ธฐํํฉ๋๋ค.experimental_useOptimistic๋ฅผ ์ฌ์ฉํ์ฌoptimisticComments์ํ์addOptimisticํจ์๋ฅผ ์์ฑํฉ๋๋ค.- ์
๋ฐ์ดํธ ํจ์๋ ์คํ๋ ๋ ๋ฌธ๋ฒ(
...state)์ ์ฌ์ฉํ์ฌnewComment๊ฐ์ฒด๋ฅผ ๊ธฐ์กดstate๋ฐฐ์ด์ ์ฐ๊ฒฐํฉ๋๋ค. - ์ฌ์ฉ์๊ฐ ๋๊ธ์ ์ ์ถํ๋ฉด ์ ๋๊ธ์ ๋ํ ์์
id๋ฅผ ์์ฑํฉ๋๋ค. ์ด๋ React๊ฐ ๋ชฉ๋ก ํญ๋ชฉ์ ๊ณ ์ ํ ํค๋ฅผ ์๊ตฌํ๊ธฐ ๋๋ฌธ์ ์ค์ํฉ๋๋ค. addOptimistic(newComment)๋ฅผ ํธ์ถํ์ฌ ๋ชฉ๋ก์ ๋๊ด์ ์ผ๋ก ๋๊ธ์ ์ถ๊ฐํฉ๋๋ค.- API ํธ์ถ์ด ์คํจํ๋ฉด
comments๋ฐฐ์ด์์ ์์id๋ฅผ ๊ฐ์ง ๋๊ธ์ ํํฐ๋งํ์ฌ ๋๊ด์ ์ ๋ฐ์ดํธ๋ฅผ ๋๋๋ฆฝ๋๋ค.
์ค๋ฅ ์ฒ๋ฆฌ ๋ฐ ์ ๋ฐ์ดํธ ๋๋๋ฆฌ๊ธฐ
๋๊ด์ ์
๋ฐ์ดํธ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ๋ ํต์ฌ์ ์ค๋ฅ๋ฅผ ์ ์์ ์ผ๋ก ์ฒ๋ฆฌํ๊ณ ์์
์ด ์คํจํ์ ๋ UI๋ฅผ ์ด์ ์ํ๋ก ๋๋๋ฆฌ๋ ๊ฒ์
๋๋ค. ์ ์์ ์์๋ try...catch ๋ธ๋ก์ ์ฌ์ฉํ์ฌ API ํธ์ถ ์ค์ ๋ฐ์ํ ์ ์๋ ๋ชจ๋ ์ค๋ฅ๋ฅผ ํฌ์ฐฉํ์ต๋๋ค. catch ๋ธ๋ก ๋ด์์๋ ์๋ ์
๋ฐ์ดํธ์ ์ญ์ ํด๋นํ๋ ๊ฐ์ addOptimistic์ ์ ๋ฌํ๊ฑฐ๋ ์ํ๋ฅผ ์๋ ๊ฐ์ผ๋ก ์ฌ์ค์ ํ์ฌ ๋๊ด์ ์
๋ฐ์ดํธ๋ฅผ ๋๋๋ ธ์ต๋๋ค.
์ค๋ฅ๊ฐ ๋ฐ์ํ์ ๋ ์ฌ์ฉ์์๊ฒ ๋ช ํํ ํผ๋๋ฐฑ์ ์ ๊ณตํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ด๋ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ํ์ํ๊ฑฐ๋, ์ํฅ์ ๋ฐ์ ์์๋ฅผ ๊ฐ์กฐ ํ์ํ๊ฑฐ๋, ๊ฐ๊ฒฐํ ์ ๋๋ฉ์ด์ ๊ณผ ํจ๊ป UI๋ฅผ ์ด์ ์ํ๋ก ๋๋๋ฆฌ๋ ๊ฒ ๋ฑ์ด ํฌํจ๋ ์ ์์ต๋๋ค.
๋๊ด์ ์ ๋ฐ์ดํธ์ ์ด์
- ์ฌ์ฉ์ ๊ฒฝํ ํฅ์: ๋๊ด์ ์ ๋ฐ์ดํธ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ๋ฐ์์ ์ด๊ณ ์ํธ์์ฉ์ ์ผ๋ก ๋๋ผ๊ฒ ํ์ฌ ๋ ๋์ ์ฌ์ฉ์ ๊ฒฝํ์ผ๋ก ์ด์ด์ง๋๋ค.
- ์ฒด๊ฐ ์ง์ฐ ์๊ฐ ๊ฐ์: ์ฆ๊ฐ์ ์ธ ํผ๋๋ฐฑ์ ์ ๊ณตํจ์ผ๋ก์จ ๋๊ด์ ์ ๋ฐ์ดํธ๋ ๋น๋๊ธฐ ์์ ์ ์ง์ฐ ์๊ฐ์ ๊ฐ๋ ค์ค๋๋ค.
- ์ฌ์ฉ์ ์ฐธ์ฌ ์ฆ๋: ๋ฐ์์ฑ์ด ๋ ์ข์ UI๋ ์ฌ์ฉ์๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ๋ ๋ง์ด ์ํธ์์ฉํ๋๋ก ์ฅ๋ คํ ์ ์์ต๋๋ค.
๊ณ ๋ ค์ฌํญ ๋ฐ ์ ์ฌ์ ๋จ์
- ๋ณต์ก์ฑ: ์ ์ฌ์ ์ธ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๊ณ UI๋ฅผ ์ด์ ์ํ๋ก ๋๋๋ ค์ผ ํ๋ฏ๋ก ๋๊ด์ ์ ๋ฐ์ดํธ๋ฅผ ๊ตฌํํ๋ฉด ์ฝ๋์ ๋ณต์ก์ฑ์ด ์ฆ๊ฐํฉ๋๋ค.
- ๋ถ์ผ์น ๊ฐ๋ฅ์ฑ: ์๋ฒ ์ธก ์ ํจ์ฑ ๊ฒ์ฌ ๊ท์น์ด ํด๋ผ์ด์ธํธ ์ธก ๊ฐ์ ๊ณผ ๋ค๋ฅผ ๊ฒฝ์ฐ, ๋๊ด์ ์ ๋ฐ์ดํธ๋ UI์ ์ค์ ๋ฐ์ดํฐ ๊ฐ์ ์ผ์์ ์ธ ๋ถ์ผ์น๋ฅผ ์ ๋ฐํ ์ ์์ต๋๋ค.
- ์ค์ํ ์ค๋ฅ ์ฒ๋ฆฌ: ์ค๋ฅ๋ฅผ ์ ๋๋ก ์ฒ๋ฆฌํ์ง ๋ชปํ๋ฉด ํผ๋์ค๋ฝ๊ณ ์ค๋ง์ค๋ฌ์ด ์ฌ์ฉ์ ๊ฒฝํ์ ์ด๋ํ ์ ์์ต๋๋ค.
experimental_useOptimistic ์ฌ์ฉ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
- ๊ฐ๋จํ๊ฒ ์์ํ๊ธฐ: ๋ ๋ณต์กํ ์๋๋ฆฌ์ค์ ๋์ ํ๊ธฐ ์ ์ ์ข์์ ๋ฒํผ์ด๋ ๋๊ธ ์นด์ดํฐ์ ๊ฐ์ ๊ฐ๋จํ ์ฌ์ฉ ์ฌ๋ก๋ถํฐ ์์ํ์ธ์.
- ์ฒ ์ ํ ์ค๋ฅ ์ฒ๋ฆฌ: ์คํจํ ์์ ์ ์ ์์ ์ผ๋ก ์ฒ๋ฆฌํ๊ณ ๋๊ด์ ์ ๋ฐ์ดํธ๋ฅผ ๋๋๋ฆด ์ ์๋ ๊ฒฌ๊ณ ํ ์ค๋ฅ ์ฒ๋ฆฌ ๋ก์ง์ ๊ตฌํํ์ธ์.
- ์ฌ์ฉ์ ํผ๋๋ฐฑ ์ ๊ณต: ์ค๋ฅ๊ฐ ๋ฐ์ํ์ ๋ ์ฌ์ฉ์์๊ฒ ์๋ฆฌ๊ณ UI๊ฐ ์ ๋๋์๊ฐ๋์ง ์ค๋ช ํ์ธ์.
- ์๋ฒ ์ธก ์ ํจ์ฑ ๊ฒ์ฌ ๊ณ ๋ ค: ๋ถ์ผ์น ๊ฐ๋ฅ์ฑ์ ์ต์ํํ๊ธฐ ์ํด ํด๋ผ์ด์ธํธ ์ธก ๊ฐ์ ์ ์๋ฒ ์ธก ์ ํจ์ฑ ๊ฒ์ฌ ๊ท์น๊ณผ ์ผ์น์ํค๋๋ก ๋ ธ๋ ฅํ์ธ์.
- ์ฃผ์ํด์ ์ฌ์ฉํ๊ธฐ:
experimental_useOptimistic๋ ์์ง ์คํ์ ๊ธฐ๋ฅ์ด๋ฏ๋ก ํฅํ React ๋ฒ์ ์์ API๊ฐ ๋ณ๊ฒฝ๋ ์ ์์์ ๊ธฐ์ตํ์ธ์.
์ค์ ์ฌ๋ก ๋ฐ ์ฌ์ฉ ์
๋๊ด์ ์ ๋ฐ์ดํธ๋ ๋ค์ํ ์ฐ์ ๋ถ์ผ์ ์ฌ๋ฌ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋๋ฆฌ ์ฌ์ฉ๋ฉ๋๋ค. ๋ช ๊ฐ์ง ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์์ ๋ฏธ๋์ด ํ๋ซํผ: ์ข์์ ๋๋ฅด๊ธฐ, ๋๊ธ ์ถ๊ฐ, ๋ฉ์์ง ๋ณด๋ด๊ธฐ. "์ข์์"๋ฅผ ํญํ ํ ์ฆ๊ฐ์ ์ธ ํผ๋๋ฐฑ์ด ์๋ ์ธ์คํ๊ทธ๋จ์ด๋ ํธ์ํฐ๋ฅผ ์์ํด ๋ณด์ธ์.
- ์ ์ ์๊ฑฐ๋ ์น์ฌ์ดํธ: ์ฅ๋ฐ๊ตฌ๋์ ์ํ ์ถ๊ฐ, ์๋ ์ ๋ฐ์ดํธ, ํ ์ธ ์ ์ฉ. ์ฅ๋ฐ๊ตฌ๋์ ์ํ์ ์ถ๊ฐํ๋ ๋ฐ ์ง์ฐ์ด ๋ฐ์ํ๋ฉด ๋์ฐํ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํฉ๋๋ค.
- ํ๋ก์ ํธ ๊ด๋ฆฌ ๋๊ตฌ: ์์ ์์ฑ, ์ฌ์ฉ์ ํ ๋น, ์ํ ์ ๋ฐ์ดํธ. Asana๋ Trello์ ๊ฐ์ ๋๊ตฌ๋ ์ ์ฐํ ์ํฌํ๋ก์ฐ๋ฅผ ์ํด ๋๊ด์ ์ ๋ฐ์ดํธ์ ํฌ๊ฒ ์์กดํฉ๋๋ค.
- ์ค์๊ฐ ํ์ ์ฑ: ๋ฌธ์ ํธ์ง, ํ์ผ ๊ณต์ , ํ์ ํ์ ์ฐธ์ฌ. ์๋ฅผ ๋ค์ด, Google Docs๋ ๊ฑฐ์ ์ฆ๊ฐ์ ์ธ ํ์ ๊ฒฝํ์ ์ ๊ณตํ๊ธฐ ์ํด ๋๊ด์ ์ ๋ฐ์ดํธ๋ฅผ ๊ด๋ฒ์ํ๊ฒ ์ฌ์ฉํฉ๋๋ค. ์ด๋ฌํ ๊ธฐ๋ฅ์ด ์ง์ฐ๋๋ค๋ฉด ์๋ก ๋ค๋ฅธ ์๊ฐ๋์ ํฉ์ด์ ธ ์๋ ์๊ฒฉ ํ์๊ฒ ์ด๋ค ์ด๋ ค์์ด ์์์ง ์๊ฐํด ๋ณด์ธ์.
๋์์ ์ธ ์ ๊ทผ ๋ฐฉ์
experimental_useOptimistic๋ ๋๊ด์ ์
๋ฐ์ดํธ๋ฅผ ๊ตฌํํ๋ ํธ๋ฆฌํ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ง๋ง, ๊ณ ๋ คํ ์ ์๋ ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์๋ ์์ต๋๋ค:
- ์๋ ์ํ ๊ด๋ฆฌ: React์
useStateํ ์ ์ฌ์ฉํ์ฌ ๋๊ด์ ์ํ๋ฅผ ์๋์ผ๋ก ๊ด๋ฆฌํ๊ณ UI๋ฅผ ์ ๋ฐ์ดํธํ๊ณ ๋๋๋ฆฌ๋ ๋ก์ง์ ์ง์ ๊ตฌํํ ์ ์์ต๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ๋ ๋ง์ ์ ์ด๊ถ์ ์ ๊ณตํ์ง๋ง ๋ ๋ง์ ์ฝ๋๊ฐ ํ์ํฉ๋๋ค. - ๋ผ์ด๋ธ๋ฌ๋ฆฌ: ์ฌ๋ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋๊ด์ ์ ๋ฐ์ดํธ ๋ฐ ๋ฐ์ดํฐ ๋๊ธฐํ๋ฅผ ์ํ ์๋ฃจ์ ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์คํ๋ผ์ธ ์ง์ ๋ฐ ์ถฉ๋ ํด๊ฒฐ๊ณผ ๊ฐ์ ์ถ๊ฐ ๊ธฐ๋ฅ์ ์ ๊ณตํ ์ ์์ต๋๋ค. ๋ ํฌ๊ด์ ์ธ ๋ฐ์ดํฐ ๊ด๋ฆฌ ์๋ฃจ์ ์ ์ํ๋ค๋ฉด Apollo Client๋ Relay์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ณ ๋ คํด ๋ณด์ธ์.
๊ฒฐ๋ก
React์ experimental_useOptimistic ํ
์ ์ฆ๊ฐ์ ์ธ ํผ๋๋ฐฑ์ ์ ๊ณตํ๊ณ ์ฒด๊ฐ ์ง์ฐ ์๊ฐ์ ์ค์ฌ ์ ํ๋ฆฌ์ผ์ด์
์ ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํค๋ ๋ฐ ์ ์ฉํ ๋๊ตฌ์
๋๋ค. ๋๊ด์ ์
๋ฐ์ดํธ์ ์๋ฆฌ๋ฅผ ์ดํดํ๊ณ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ฉด, ์ด ๊ฐ๋ ฅํ ๊ธฐ์ ์ ํ์ฉํ์ฌ ๋ ๋งค๋ ฅ์ ์ด๊ณ ์ฑ๋ฅ์ด ๋ฐ์ด๋ React ์ ํ๋ฆฌ์ผ์ด์
์ ๋ง๋ค ์ ์์ต๋๋ค. ์ค๋ฅ๋ฅผ ์ ์์ ์ผ๋ก ์ฒ๋ฆฌํ๊ณ ํ์ํ ๋ UI๋ฅผ ์ด์ ์ํ๋ก ๋๋๋ฆฌ๋ ๊ฒ์ ์์ง ๋ง์ธ์. ๋ค๋ฅธ ์คํ์ ๊ธฐ๋ฅ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก, ํฅํ React ๋ฒ์ ์์์ ์ ์ฌ์ ์ธ API ๋ณ๊ฒฝ์ ์ ์ํด์ผ ํฉ๋๋ค. ๋๊ด์ ์
๋ฐ์ดํธ๋ฅผ ์ฑํํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์
์ ์ฒด๊ฐ ์ฑ๋ฅ๊ณผ ์ฌ์ฉ์ ๋ง์กฑ๋๋ฅผ ํฌ๊ฒ ํฅ์์์ผ ์ ์ธ๊ณ ์ฌ์ฉ์๋ฅผ ์ํด ๋ ์ธ๋ จ๋๊ณ ์ฆ๊ฑฐ์ด ์ฌ์ฉ์ ๊ฒฝํ์ ๊ธฐ์ฌํ ์ ์์ต๋๋ค.